package com.mindbox.mueblesalpes.presentacion.filter;

import com.mindbox.mueblesalpes.negocio.entity.Cliente;
import com.mindbox.mueblesalpes.negocio.entity.TipoUsuario;
import com.mindbox.mueblesalpes.negocio.entity.Usuario;
import com.mindbox.mueblesalpes.negocio.persistence.PersistenciaLocal;
import com.mindbox.mueblesalpes.negocio.seguridad.ISecurityService;
import com.mindbox.mueblesalpes.presentacion.sesion.SessionInfo;
import com.mindbox.mueblesalpes.presentacion.utils.RequestParameters;
import java.io.IOException;
import java.security.Principal;
import javax.ejb.EJB;
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Filtro para validar si un usuario esta logueado y obtener el objeto de sesión
 * @author Jaimoto
 */
public class SessionFilter implements Filter{

    @EJB
    private ISecurityService securityService;

    @EJB
    private PersistenciaLocal persistencService;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = ((HttpServletRequest) request);
        HttpServletResponse httpResponse = ((HttpServletResponse) response);

        try {
            HttpSession sesion = httpRequest.getSession();
            Principal principal = httpRequest.getUserPrincipal();
            FacesContext facesContext = FacesContext.getCurrentInstance();
            if (principal != null) {
                Usuario user = new Usuario();
                user.setUsuario(principal.getName());
                user = securityService.login(principal.getName(),null);
                SessionInfo sesionInfo = (SessionInfo) sesion.getAttribute(SessionInfo.class.getName());
                if(user == null){
                    httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR , "Error al obtener el usuario");
                }
                if (sesionInfo == null) {
                    sesionInfo = new SessionInfo();
                    //obtener regla de navegación posterior al logueo

                }
                String next = (String)sesion.getAttribute(RequestParameters.next_page.name());
                sesion.removeAttribute(RequestParameters.next_page.name());
                if (user.getTipoUsuario() == TipoUsuario.ADMINISTRADOR) {
                    sesionInfo.setUsuario(user);
                    sesion.setAttribute(SessionInfo.class.getName(), sesionInfo);
                    //validar si se tiene alguna regla de navegacion
                    //TODO redireccionamiento a ventas
                /*if(getNext() != null && getNext().trim().length() != 0 ){
                    return getNext();
                    }else{
                    return "inicio";
                    }*/
                } else {
                    Cliente cliente = securityService.getUsuario(user);
                    sesionInfo.setUsuario(user);
                    sesionInfo.setCliente(cliente);
                    sesion.setAttribute(SessionInfo.class.getName(), sesionInfo);
                    //validar si se tiene alguna regla de navegacion
                    //TODO redireccionamiento a ventas
                /*if(getNext() != null && getNext().trim().length() != 0 ){
                    return getNext();
                    }else{
                    return "inicio";
                    }*/
                }
                if(next != null){
                     httpResponse.sendRedirect(httpRequest.getContextPath()+"/pages/compras/agregar_carrito.jsf");

                    /*NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
                    nh.handleNavigation(facesContext, "", next);*/
                }
            }

            chain.doFilter(request, response);
        } catch (IOException iOException) {
            iOException.printStackTrace();
            httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR , "Error al obtener el usuario");
        } catch (ServletException servletException) {
            servletException.printStackTrace();
            httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR , "Error al obtener el usuario");
        } catch (Exception e) {
            e.printStackTrace();
            httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR , "Error al obtener el usuario");
        }
    }

    @Override
    public void destroy() {
        
    }


}
